#include "MySystick.h"

//使用定时器实现精准延时测试程序   V1.0           修改日期：2025/6/16
//实现功能：每5s打印一次信息
//By:TAO XIN YU (陶鑫宇)
 

//初始化滴答定时器(自定义)
//无参
//无返回值
void MySystick_init(void)
{
	//使能定时器外设时钟
	rcu_periph_clock_enable(MySystick_RCU_Timerx);
	
	//声明TIMER参数配置结构体
	timer_parameter_struct timer_initpara={0};
	
	//恢复定时器缺省配置
	timer_deinit(MySystick_Timerx);
	timer_struct_para_init(&timer_initpara);
	
	//对齐模式，边沿对齐
	timer_initpara.alignedmode=TIMER_COUNTER_EDGE;
	//时钟分频 不分频
	timer_initpara.clockdivision=TIMER_CKDIV_DIV1;
	//计数模式，向上计数
	timer_initpara.counterdirection=TIMER_COUNTER_UP;
	//设置重装载计数器最大值
	timer_initpara.period=0xffff;
	//设置预分配器
	timer_initpara.prescaler=72-1;
	//设置重复计数器
	timer_initpara.repetitioncounter=0;
	//初始化定时器
	timer_init(MySystick_Timerx,&timer_initpara);

	//使能定时器
	timer_enable(MySystick_Timerx);

}

//Us延迟函数
//参数：xus ：需要延迟的微秒数
//无返回值
void MyDelay_us(unsigned int xus)
{
	//入口参数检查，因为计数器为16位
	if(xus>=65535)
	{
		xus=65535;
	}
	//清零计数值
	timer_counter_value_config(MySystick_Timerx,0);
	//等待延迟
	while(timer_counter_read(MySystick_Timerx)<=xus);
}

//Ms延迟函数
//参数：xms ：需要延迟的毫秒数
//无返回值
void MyDelay_ms(unsigned int xms)
{
	//以1000us为时基，每次使xms-1，直到xms为0，即到达预定时间
	while(xms--)
	{
		MyDelay_us(1000);
	}
}

//S延迟函数
//参数：xs ：需要延迟的秒数
//无返回值
void MyDelay_s(unsigned int xs)
{
	//以1000ms为时基，每次使xms-1，直到xms为0，即到达预定时间
	while(xs--)
	{
		MyDelay_ms(1000);
	}
}
